use colored::*;
use regex::Regex;
use std::fs;

/// 验证提交信息格式
pub fn validate_commit_msg(msg_file: &str) -> bool {
    // 读取提交信息
    let msg = match fs::read_to_string(msg_file) {
        Ok(content) => content.trim().to_string(),
        Err(e) => {
            eprintln!("{}", format!("❌ 读取提交信息失败: {}", e).red());
            return false;
        }
    };

    // 忽略空提交信息（可能是合并提交等）
    if msg.is_empty() {
        return true;
    }

    // 提交信息格式规范：[类型] 描述
    // 类型: feat, fix, docs, style, refactor, test, chore
    // 描述: 至少10个字符
    let pattern = Regex::new(r"^\[(feat|fix|docs|style|refactor|test|chore)\] .{10,}").unwrap();

    if pattern.is_match(&msg) {
        true
    } else {
        eprintln!("{}", "❌ 提交信息格式错误".red());
        eprintln!();
        eprintln!("{}", "📋 格式要求:".cyan().bold());
        eprintln!("  [类型] 描述(至少10个字符)");
        eprintln!();
        eprintln!("{}", "📝 可用类型:".cyan().bold());
        eprintln!("  feat     - 新功能");
        eprintln!("  fix      - 修复bug");
        eprintln!("  docs     - 文档更新");
        eprintln!("  style    - 代码格式调整");
        eprintln!("  refactor - 代码重构");
        eprintln!("  test     - 测试相关");
        eprintln!("  chore    - 构建/工具变动");
        eprintln!();
        eprintln!("{}", "✨ 示例:".green().bold());
        eprintln!("  [feat] 添加用户登录功能");
        eprintln!("  [fix] 修复列表滚动卡顿问题");
        eprintln!("  [docs] 更新README安装说明");
        eprintln!();
        eprintln!("{}", "💡 当前提交信息:".yellow());
        eprintln!("  {}", msg);
        
        false
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use std::io::Write;
    use tempfile::NamedTempFile;

    #[test]
    fn test_valid_commit_msg() {
        let mut file = NamedTempFile::new().unwrap();
        writeln!(file, "[feat] 添加用户登录功能").unwrap();
        
        assert!(validate_commit_msg(file.path().to_str().unwrap()));
    }

    #[test]
    fn test_invalid_commit_msg() {
        let mut file = NamedTempFile::new().unwrap();
        writeln!(file, "add login").unwrap();
        
        assert!(!validate_commit_msg(file.path().to_str().unwrap()));
    }

    #[test]
    fn test_short_description() {
        let mut file = NamedTempFile::new().unwrap();
        writeln!(file, "[feat] 添加").unwrap();
        
        assert!(!validate_commit_msg(file.path().to_str().unwrap()));
    }
}